package com.t.bricks.bussiness.controller.orders;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.t.bricks.bussiness.controller.common.BaseController;
import com.t.bricks.bussiness.db.entity.orders.Orders;
import com.t.bricks.bussiness.model.orders.ConditionOrders;
import com.t.bricks.bussiness.service.orders.OrdersService;
import com.t.bricks.model.MsgEmity;
import com.t.bricks.utils.modules.web.FindByPageParam;

/**
 * 订单控制层
 * 继承BaseController可直接实现通用方法,三个泛型代表:业务类、实体类、查询类
 * 通用业务类CommonService已经包含常用功能,使用自定义OrdersService(需实现)可覆盖通用方法或扩展业务功能
 * 通用查询类可以直接使用Map,否则使用自定义ConditionOrders(需实现)
 * @author HuangXinBian
 * @DateTime 2022年06月22日 15:25:29
 */
@RestController
@Api(value="订单", tags={"订单操作接口"})
@RequestMapping("/orders/")
public class OrdersController extends BaseController<OrdersService<Orders>, Orders, ConditionOrders> {
	
	/**
	 * 控制操作,首位9不参与用6个数代表开关,0为不限制,1为限制
	 * 6个数的控制分别是:删除、修改、查询、导出、统计、步骤值可逆
	 * 其中前5个为'是否仅创建者可操作'后续为其它控制开关
	 */
	protected int enableTag = 911111;

	/**
	 * 设置 检查待新增内容是否存在重复数据(多字段组合重复即重复)集合
	 * @return 返回的集合将覆盖父类的checkRepeatCombination成员,若返回null则不进行重复校验
	 */
	@Override
	protected List<String> setCheckRepeatCombination() {
		return Arrays.asList("sSequence");
	}

	/**
	 * 设置 检查待新增内容是否存在重复数据(单独字段重复即重复)集合
	 * @return 返回的集合将覆盖父类的checkRepeatAlone成员,若返回null则不进行重复校验
	 */
	@Override
	protected Map<String, Integer> setCheckRepeatAlone() {
		return null;
	}

	/**
	 * 删除数据
	 * @param iVersion
	 * @param id 记录编号
	 * @return MsgEmity
	 */
	@RequestMapping(method={RequestMethod.POST}, value="/del")
	@Override
	public MsgEmity del(Integer iVersion, String id) {
		return super.del(iVersion, id);//直接使用父类中定义的方法,否则使用ordersService.del(iVersion, sId);
	}

	/**
	 * 新增数据
	 * @param orders 订单实体对象
	 * @return MsgEmity
	 */
	@ApiOperation(value="新增数据", response=Orders.class)
	@RequestMapping(method={RequestMethod.POST}, value="/add")
	@Override
	public MsgEmity add(@RequestBody Orders orders) {
		return super.service().addCustom(orders);
	}

	/**
	 * 根据记录编号查询符合分页数据的某条记录
	 * @param id 记录编号
	 * @return MsgEmity
	 */
	@ApiOperation(value="根据记录编号查询符合分页数据的某条记录", response=Orders.class)
	@RequestMapping(method={RequestMethod.POST}, value="/find/page/row")
	@Override
	public MsgEmity findByPageRow(String id) {
		return super.findByPageRow(id);//直接使用父类中定义的方法,否则使用ordersService.findByPageRow(id);
	}

	/**
	 * 查询分页数据
	 * @param findByPageParam 分页查询条件组合类
	 * 结构参考: {"page": 分页请求信息对象, "orders": 排序信息对象集合, "sLikeStr": 全文检索, "condition": 查询条件对象}
	 * @return MsgEmity 返回查询结果
	 */
	@ApiOperation(value="查询分页数据", response=Orders.class)
	@RequestMapping(method={RequestMethod.POST}, value="/find/page")
	@Override
	public MsgEmity findByPage(@RequestBody FindByPageParam<ConditionOrders> findByPageParam) {//findByPage(@RequestBody FindByPageParam<ConditionOrders> findByPageParam)
		return super.findByPage(findByPageParam);//直接使用父类中定义的方法,否则使用 ordersService.findByPage(findByPageParam.getPage(), findByPageParam.getOrders(), findByPageParam.getsLikeStr(), findByPageParam.getCondition());
	}

	//---------------------------- 自动生成代码结束 ----------------------------//
	
	/**
	 * 查询购物车对应详情
	 * @param cartIds 购物车编号(分号分隔)
	 * @return List<OrdersDetailBase>
	 */
	@ApiOperation(value="查询购物车对应详情")
	@ApiImplicitParams({
		@ApiImplicitParam(name="cartIds", value="购物车编号(分号分隔)", dataType="String", paramType="query", required=true)
	})
	@RequestMapping(method={RequestMethod.POST}, value="/find/detail")
	public MsgEmity cartToDetail(String cartIds) {
		return service().cartToDetail(cartIds);
	}
	
	/**
	 * 设置状态-支付
	 * @param sId 记录编号
	 * @param sRechargeNo 充值订单号
	 * @param iVersion 记录版本号
	 * @param sPayPass 支付密码
	 * @param sPaySignPass 支付手势密码
	 * @return
	 */
	@ApiOperation(value="设置状态-支付", notes="限客户操作")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sId", value="记录编号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sRechargeNo", value="充值订单号", dataType="Integer", paramType="query", required=true),
		@ApiImplicitParam(name="iVersion", value="记录版本号", dataType="Integer", paramType="query", required=true),
		@ApiImplicitParam(name="sPayPass", value="支付密码", dataType="String", paramType="query", required=false),
		@ApiImplicitParam(name="sPaySignPass", value="支付手势密码", dataType="String", paramType="query", required=false)
	})
	@RequestMapping(method={RequestMethod.POST}, value="/pay")
	public MsgEmity pay(String sId, String sRechargeNo, Integer iVersion, String sPayPass, String sPaySignPass) {
		return service().pay(sId, sRechargeNo, iVersion, sPayPass, sPaySignPass);
	}
	
	/**
	 * 设置状态-免密支付(仅限订单所属顾客操作)
	 * @param sId 记录编号
	 * @param sRechargeNo 充值订单号
	 * @param iVersion 记录版本号
	 * @return
	 */
	@ApiOperation(value="设置状态-免密支付", notes="仅限订单所属顾客操作")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sId", value="记录编号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sRechargeNo", value="充值订单号", dataType="Integer", paramType="query", required=true),
		@ApiImplicitParam(name="iVersion", value="记录版本号", dataType="Integer", paramType="query", required=true)
	})
	@RequestMapping(method={RequestMethod.POST}, value="/pay/not/pass")
	public MsgEmity payNotPass(String sId, String sRechargeNo, Integer iVersion) {
		return service().payNotPass(sId, sRechargeNo, iVersion);
	}
	
	/**
	 * 设置状态-销售
	 * @param sId 记录编号
	 * @param iVersion 记录版本号
	 * @return
	 */
	@ApiOperation(value="设置状态-销售", notes="限后台管理员")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sId", value="记录编号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="iVersion", value="记录版本号", dataType="Integer", paramType="query", required=true)
	})
	@RequestMapping(method={RequestMethod.POST}, value="/sales")
	public MsgEmity sales(String sId, Integer iVersion) {
		return service().sales(sId, iVersion);
	}
	
	/**
	 * 设置状态-送出(待揽货)
	 * @param sId 记录编号
	 * @param iVersion 记录版本号
	 * @param sDeliveryDate 送出时间
	 * @param sDelivery 出库说明
	 * @param sDeliveryman 送货人
	 * @param sDeliveryNo 快递编号
	 * @param sDelveryCode 快递公司编码
	 * @return
	 */
	@ApiOperation(value="设置状态-送出(待揽货)", notes="限后台管理员")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sId", value="记录编号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="iVersion", value="记录版本号", dataType="Integer", paramType="query", required=true),
		@ApiImplicitParam(name="sDeliveryDate", value="送出时间", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sDelivery", value="出库说明", dataType="String", paramType="query", required=false),
		@ApiImplicitParam(name="sDeliveryman", value="送货人", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sDelivery", value="快递编号", dataType="String", paramType="query", required=false),
		@ApiImplicitParam(name="sDelveryCode", value="快递公司编码", dataType="String", paramType="query", required=false)
	})
	@RequestMapping(method={RequestMethod.POST}, value="/delivery")
	public MsgEmity delivery(String sId, Integer iVersion, String sDeliveryDate,
			String sDelivery, String sDeliveryman, String sDeliveryNo,
			String sDelveryCode) {
		return service().delivery(sId, iVersion, sDeliveryDate, sDelivery,
				sDeliveryman, sDeliveryNo, sDelveryCode);
	}
	
	/**
	 * 顾客操作状态值
	 * 5:已签收;6:已确认;7:退货申请
	 * @param sId 记录编号
	 * @param iVersion 记录版本号
	 * @param iState 状态值[5:已签收;6:已确认;7:退货申请]
	 * @param sTxt 签收说明|确认说明|退货申请说明
	 * @return
	 */
	@ApiOperation(value="顾客操作状态值", notes="[5:已签收;6:已确认;7:退货申请]限客户操作")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sId", value="记录编号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="iVersion", value="记录版本号", dataType="Integer", paramType="query", required=true),
		@ApiImplicitParam(name="iState", value="状态值[5:已签收;6:已确认;7:退货申请]", dataType="Integer", paramType="query", required=true),
		@ApiImplicitParam(name="sTxt", value="签收说明|确认说明|退货申请说明", dataType="String", paramType="query", required=true)
	})
	@RequestMapping(method={RequestMethod.POST}, value="/changeState/customer")
	public MsgEmity changeStateByCustomer(String sId, Integer iVersion, Integer iState, String sTxt) {
		switch (iState) {
		case 5:
			return service().signIn(sId, iVersion, sTxt);
		case 6:
			return service().confirm(sId, iVersion, sTxt);
		case 7:
			return service().returnApply(sId, iVersion, sTxt);
		default:
			return MsgEmity.err(9001, "限定请求类型[5,6,7]");
		}
	}
	
	/**
	 * 退货审核
	 * 8:退货审核不通过;9:退货申请通过;10:已退款
	 * @param sId 记录编号
	 * @param iVersion 记录版本号
	 * @param iState 状态值
	 * @return
	 */
	@ApiOperation(value="退货审核", notes="限后台管理员")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sId", value="记录编号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="iVersion", value="记录版本号", dataType="Integer", paramType="query", required=true),
		@ApiImplicitParam(name="iState", value="状态值[5:已签收;6:已确认;7:退货申请]", dataType="Integer", paramType="query", required=true)
	})
	@RequestMapping(method={RequestMethod.POST}, value="/untread/audit")
	public MsgEmity untreadAudit(String sId, Integer iVersion, Integer iState) {
		return service().untreadAudit(sId, iVersion, iState);
	}
	
	/**
	 * 设置状态-审核
	 * @param sId 记录编号
	 * @param iVersion 记录版本号
	 * @return
	 */
	@ApiOperation(value="设置状态-审核", notes="限后台管理员")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sId", value="记录编号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="iVersion", value="记录版本号", dataType="Integer", paramType="query", required=true)
	})
	@RequestMapping(method={RequestMethod.POST}, value="/audit")
	public MsgEmity audit(String sId, Integer iVersion) {
		return service().audit(sId, iVersion);
	}
	
	/**
	 * 设置状态-复审
	 * @param sId 记录编号
	 * @param iVersion 记录版本号
	 * @return
	 */
	@ApiOperation(value="设置状态-复审", notes="限后台管理员")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sId", value="记录编号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="iVersion", value="记录版本号", dataType="Integer", paramType="query", required=true)
	})
	@RequestMapping(method={RequestMethod.POST}, value="/recheck")
	public MsgEmity recheck(String sId, Integer iVersion) {
		return service().recheck(sId, iVersion);
	}
	
	/**
	 * 根据订单详情和目的地,测算运费
	 * @param iNumbers 订单详情中的数量集合(分号分隔)
	 * @param sWaresIds 订单详情中的商品编号集合(分号分隔)
	 * @param sArea 目的地
	 * @return
	 */
	@ApiOperation(value="根据订单详情和目的地,测算运费", notes="运值和商品编号必须一一对应")
	@ApiImplicitParams({
		@ApiImplicitParam(name="iNumbers", value="订单详情中的数量集合(分号分隔)", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sWaresIds", value="订单详情中的商品编号集合(分号分隔)", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sArea", value="目的地", dataType="String", paramType="query", required=true)
	})
	@RequestMapping(method={RequestMethod.POST}, value="/reckon/freight")
	public MsgEmity reckonFreight(String iNumbers, String sWaresIds, String sArea) {
		return service().reckonFreight(iNumbers, sWaresIds, sArea);
	}
	
	/**
	 * 查看快递信息
	 * @param sId 记录编号
	 * @return
	 */
	@ApiOperation(value="查看快递信息")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sId", value="记录编号", dataType="String", paramType="query", required=true)
	})
	@RequestMapping(method={RequestMethod.POST}, value="/look/delivery")
	public MsgEmity lookDelivery(String sId) {
		return service().lookDelivery(sId);
	}

}
